package com.examination.framework.utils;



import org.apache.ibatis.builder.annotation.ProviderContext;

import javax.persistence.Table;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author 寇淇芮
 * @Date 2019/10/30 16:59
 */
public class DynamicSqlUtil {
    /**
     * 根据ProviderContext 对象获取到对应的实体对象
     * 找到 Table 注解拿到name名称
     * 如果没有该注解返回null
     * @param providerContext
     * @return
     */
    public static String getTableName(ProviderContext providerContext) {
        /**
         * 而 “？”则属于类型通配符的一种
         *  providerContext.getMapperType() 返回的是 class<?> 对象
         *  class.getGenericInterfaces 返回实现接口信息的Type数组，包含泛型信息
         *
         */
        Type[] genericInterfaces = providerContext.getMapperType().getGenericInterfaces();
        if(genericInterfaces==null){
            return null;
        }
        //返回表示此类型实际类型参数的 Type 对象的数组
        Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
        if(actualTypeArguments.length==0){
            return null;
        }
        //com.examination.system.instructor.student.ext.TbStudentEssential
        //获取到胡所有包名 com.examination.system.instructor.student.ext.TbStudentEssential
        Class<?> clazz = null;
        try {
            clazz = Class.forName(actualTypeArguments[0].getTypeName());
            Table table = clazz.getAnnotation(Table.class);
            String tableName = table.name();
            return tableName;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }



}
